<?php

/*
 * Класс абстрактного элемента дерева
 * Наследуется классами элементов конкретных реализаций
 */

namespace T4\TREE;

abstract class ANode  {
    
    /**
     *
     * @var \T4\TREE\ATree Ссылка на дерево, которому принадлежит нода 
     */
    protected $tree;

    /**
     *
     * @var \T4\AModel Объект модели данных
     */
    protected $model;
    
    /**
     *
     * @var int Уровень ноды в дереве относительно корня 
     */
    public $level;


    /**
     * Конструктор объекта узла дерева
     * @param \T4\TREE\ATree $tree Ссылка на дерево, которому принадлежит нода
     * @param \T4\AModel $model Объект модели данных
     */
    final public function __construct(\T4\TREE\ATree $tree, $model) {
	$this->tree = $tree;
	$this->model = $model;
    }
    
    /**
     * Магические методы для доступа к внутреннему представлению данных
     */
    final public function __set($name, $value) {
	$this->model->{$name} = $value;
    }
    final public function __get($name) {
	return $this->model->{$name};
    }
    final public function __isset($name) {
	return $this->model->__isset($name);
    }


    /**
     * Методы, которые должны быть определены в классах нод конкретного типа
     */    
    abstract public function getParent();
    abstract public function getAllParents();
    
}